﻿Imports Persistencia
Imports DSControlePadrao
Public Class ctrProduto
    Inherits ctrPadrao

#Region "Enumerações"

    Public Enum eColunasProdutos
        COD_REGIAO = 0
        REGIAO = 1
        COD_ITEM = 2
        COD_PRODUTO = 3
        PRODUTO = 4
        FORMA = 5
        QUANTIDADE = 6
        UNIDADE = 7
        PESO = 8
        PESO_TOTAL = 9
        NCM = 10
        FATURAMENTO = 11
        IPI = 12
        MARCA = 13
        VALOR_MARCA = 14
        ROYALTIES = 15
        CUSTO_UNITARIO = 16
        CUSTO_MARCA = 17
        VALOR_UNITARIO = 18
        VALOR_ROYALTIES = 19
        VALOR_FRETE = 20
        VALOR_FORMA = 21
        VALOR_IPI = 22
        VALOR_ICMS = 23
        VALOR_PIS_COFINS = 24
    End Enum

    Public Enum tipoProduto
        Todos = 0
        Magnesita = 1
        Terceiros = 2
    End Enum

    Public Enum eUnidadeCalculo
        POR_PECA = 0
        POR_PESO = 1
    End Enum

    Public Enum eValidaInclusaoProduto
        COD_PRODUTO_INVALIDO = 0
        QUANTIDADE_INVALIDA = 1
        COD_REGIAO_OBRIGATORIO = 2
    End Enum

#End Region

#Region "Variáveis de classe"

    Private objProduto As New perProduto

    Public sValidaInclusao As String() = {"Produto não informado.",
                                          "Quantidade inválida.",
                                          "Região obrigatória."}

#End Region

#Region "Métodos públicos"

    Public Function retornarDatProdutos() As DataTable
        Dim datProduto As New DataTable

        With datProduto
            .Columns.Add("codRegiao", GetType(Integer))
            .Columns.Add("Regiao", GetType(String))
            .Columns.Add("item", GetType(Integer))
            .Columns.Add("codProduto", GetType(String))
            .Columns.Add("descProduto", GetType(String))
            .Columns.Add("forma", GetType(Boolean))
            .Columns.Add("quantidade", GetType(Integer))
            .Columns.Add("unidade", GetType(String))
            .Columns.Add("pesoBrutoUnitario", GetType(Double))
            .Columns.Add("pesoTotal", GetType(Double))
            .Columns.Add("ncm", GetType(String))
            .Columns.Add("cnpj", GetType(String))
            .Columns.Add("ipi", GetType(Double))
            .Columns.Add("descMarca", GetType(String))
            .Columns.Add("valorMarca", GetType(Decimal))
            .Columns.Add("royalties", GetType(Double))
            .Columns.Add("custo", GetType(Decimal))
            .Columns.Add("custoMarca", GetType(Decimal))
            .Columns.Add("valorUnitario", GetType(Decimal))
            .Columns.Add("valorRoyalties", GetType(Decimal))
            .Columns.Add("valorFrete", GetType(Decimal))
            .Columns.Add("valorForma", GetType(Decimal))
            .Columns.Add("valorIPI", GetType(Decimal))
            .Columns.Add("valorICMS", GetType(Decimal))
            .Columns.Add("valorPIS_COFINS", GetType(Decimal))

            .TableName = "Produtos"

        End With

        Return datProduto

    End Function

    Public Function selecionarProduto(ByVal sCodCliente As String) As DataTable

        Try
            Return objProduto.selecionarProduto(sCodCliente)
        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao selecionar os dados do produto. " & _
                                    Environment.NewLine & ex.Message)


        End Try

    End Function

    Public Function sqlConsulta(ByVal tipoProduto As tipoProduto)

        Return objProduto.sqlConsulta(tipoProduto)

    End Function

    Public Function retornaUnidadeCalculo(ByVal sUnidade As String) As eUnidadeCalculo
        Try

            Select Case sUnidade.Trim.ToUpper

                Case "PC", "PÇ", "CJT"
                    Return eUnidadeCalculo.POR_PECA

                Case "KG", "TO"
                    Return eUnidadeCalculo.POR_PESO

                Case Else

                    Throw New Exception("Unidade do produto não reconhecida." & Environment.NewLine &
                                        "Será utilizado para fins de cálculo a unidade TO (tonelada).")
                    Return eUnidadeCalculo.POR_PESO

            End Select

        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao retornar unidade de cálculo. " &
                                    Environment.NewLine & ex.Message)


        End Try

    End Function

    Public Function calcularPesoTotal(ByVal dQuant As Double, ByVal dPesoUnitario As Double, ByVal sUnidade As String) As Double
        Dim dPesoTotal As Double = 0

        Try

            Select Case sUnidade.Trim.ToUpper

                Case "PC", "PÇ", "CJT"
                    dPesoTotal = (dQuant * dPesoUnitario) / 1000

                Case "KG", "TO"
                    dPesoTotal = dQuant * dPesoUnitario

                Case Else
                    Throw New Exception("Peso total não pode ser calculado. " & Environment.NewLine &
                                        "Unidade do produto não reconhecida.")
            End Select

            Return dPesoTotal

        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao calcular peso total. " &
                                    Environment.NewLine & ex.Message)


        End Try


    End Function

    Public Function validaInclusaoProdutoProposta(ByVal iCodregiao As Int32, ByVal sCodProduto As String, ByVal dQuantidade As Double) As Boolean
        Dim bRetorno As Boolean = True

        Try
            MyBase.limparMensagensValidacao()
            If String.IsNullOrEmpty(sCodProduto) Then
                MyBase.adicionarMensagensValidacao(eValidaInclusaoProduto.COD_PRODUTO_INVALIDO,
                                                   ctrPadrao.eTipoLog.ERRO,
                                               Me.sValidaInclusao(eValidaInclusaoProduto.COD_PRODUTO_INVALIDO))
                bRetorno = False
            End If

            If dQuantidade = 0 Then
                MyBase.adicionarMensagensValidacao(eValidaInclusaoProduto.QUANTIDADE_INVALIDA,
                                                   ctrPadrao.eTipoLog.ERRO,
                                               Me.sValidaInclusao(eValidaInclusaoProduto.QUANTIDADE_INVALIDA))
                bRetorno = False
            End If

            If iCodregiao = 0 Then
                MyBase.adicionarMensagensValidacao(eValidaInclusaoProduto.COD_REGIAO_OBRIGATORIO,
                                                   ctrPadrao.eTipoLog.ERRO,
                                               Me.sValidaInclusao(eValidaInclusaoProduto.COD_REGIAO_OBRIGATORIO))
                bRetorno = False
            End If

            Return bRetorno

        Catch ex As Exception
            bRetorno = False
            Throw New Exception("Ocorreu um erro ao validar a inclusão do produto na proposta. " & _
                                Environment.NewLine & ex.Message)


        End Try

    End Function

    Public Function calcularFreteUnitarioProduto(ByVal dValorFrete As Decimal, ByVal dPesoUnitario As Decimal, ByVal dQuantidade As Decimal, ByVal iUnidade As eUnidadeCalculo)

        Dim dValorFreteUnitario As Decimal = 0
        Try
            dValorFreteUnitario = dValorFrete * dPesoUnitario

        Catch ex As Exception

            MsgBox(ex.Message, MsgBoxStyle.Critical, Application.ProductName)

        End Try

        Return dValorFreteUnitario

    End Function

    Public Function calcularPrecoUnitario(ByVal dValorTonelada As Decimal, ByVal dPesoUnitario As Double, ByVal sUnidade As String) As Decimal
        Dim dValorKg As Decimal
        Dim eUnidadeCalculo As eUnidadeCalculo
        Try
            eUnidadeCalculo = Me.retornaUnidadeCalculo(sUnidade)

            Select Case eUnidadeCalculo
                Case ctrProduto.eUnidadeCalculo.POR_PECA
                    dValorKg = dValorTonelada / 1000
                Case ctrProduto.eUnidadeCalculo.POR_PESO
                    dValorKg = dValorTonelada
            End Select

            Return dPesoUnitario * dValorKg

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, Application.ProductName)
        End Try

    End Function

    Public Function calcularImposto(ByVal dPrecoTotal As Decimal, ByVal dValorForma As Decimal, ByVal dICMS As Decimal) As Decimal

        Try

        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao calcular o imposto. " & _
                                    Environment.NewLine & ex.Message)


        End Try
    End Function

#End Region

End Class
